上篇文章:Linux基础3-基础工具4(git),冯诺依曼计算机体系结构-CSDN博客
本章重点:
1. 操作系统简介
2. 什么是进程?
3. 在Linux使用命令查看进程(ps)
4. getpid,getppid, fork简介
上一章我们了解了冯诺依曼计算机体系结构,我们需要知道数据是如何进行流动的
请解释:你从qq发送一条消息到你的朋友并被接收,数据是如何流动的(暂时不考虑网络层)
我的键盘输入 --> 我的内存 --> 我的CPU处理 --> 我的内存 --> 我的网卡处理输出
--> 网络 --> 我朋友的网卡处理输入 --> 我朋友的内存 --> 我朋友的CPU处理 --> 我朋友的内存 --> 我朋友的显示器输出
目录
一. 操作系统
根据冯诺依曼计算机体系结构,我们知道计算机由输入,输出设备,存储器,cpu等组成,计算机是如何对这些硬件和其他软件进行管理的?(如果不管理的话不就乱套了)
操作系统是进行软硬件资源管理的软件.
为什么要对这些资源进行管理?
(操作系统通过管理软硬件资源,给用户提供良好的,稳定的,安全的执行环境)
操作系统如何对这些软硬件资源进行管理?(先描述后组织)
1. 使用struct_task进行描述进程,再使用链表等结构进行管理
2. 操作系统通过对数据的管理来管理软硬件,创建进程来管理资源
计算机的软硬件结构如下
系统调用和库函数辨析
1. 在开发角度,操作系统作为一个整体,会暴露自己部分接口,供外部进行开发使用,这些接口被称为系统调用
2. 系统调用在使用上比较基础,而且使用的要求对用户高.所以部分开发者对系统调用进行适度封装,逐渐形成库,更方便开发者进行开发和二次开发
二. 进程介绍
什么是进程?
进程就是运行起来(被加载到内存)的程序。
有很多加载到内存中的程序,操作系统如何管理它们呢?
管理需要先组织,再管理。操作系统通过进程控制块(PCB)来对进程进行管理,PCB中含有很多进程的信息。
在Linux中,PCB是task_struct
//PCB内核结构体(内核结构体可以创建内核对象,将这个结构和我们的代码数据关联起来)
//这样我们就能通过管理PCB进而管理进程
struct task_struct
{
//该进程的所有属性
//该进程对应的代码和属性地址
struct task_struct* next;//如通过链表链接所有进程,方便对进程进行管理
};
这样就实现了:对进程管理 ----> 对PCB链表管理(增删查改等)
所以: 进程=内核数据结构+进程相应大端数据代码
且操作系统在调度进程的时候,进程具有动态属性
三. Linux下查看进程,杀死进程
以下是Linux下常用的查看进程的命令
ps axj //查看所有进程
ps axj | head -1 //查看进程各项属性的标题
ps axj | grep 进程名称 // 通过grep过滤出我们需要查找的进程
ps axj | grep head -1 && ps axj | grep 进程名称 //查看标题同时进程查找
kill -9 进程pid //杀死这个pid的进程
举例:
1.
2.
3.
4.
另外一种查看进程的方式
在Linux下,一切皆文件。进程也不例外,在系统中,创建一个进程后,就有一个进程文件
使用 ls /proc 即可查看进程目录
四. 查看进程pid和创建子进程
4.1 getpid getppid 查看进程的pid
我们创建一个进程后,如何获取进程的pid??
#include <unistd.h> //头文件
//这两个都是系统调用
getpid() //获取进程的pid
getppid() //获取进程父进程的pid
#include <stdio.h>
#include <unistd.h>
int main()
{
while(1)
{
printf("我是一个进程 pid:%d 我父进程的pid:%d\n", getpid(), getppid());
sleep(1);
}
return 0;
}
运行结果:
4.2 fork创建子进程
fork()
//用于创建子进程,
//创建失败返回负数,父进程返回子进程pid,子进程返回0
//fork之后,会有父进程,子进程两个进程执行后续代码
//fork后续的代码,被父子进程共享
//通过返回值不同,父子进程执行后续共享代码的一部分(个进程的执行是并发的)
举例:
该代码在创建子进程后,各自输出自己的pid和自己父亲的pid
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t id = fork(); //创建子进程
if(id == 0)
{
//child
while(1)
{
printf("我的子进程,我的pid为:%d,我父亲的pid为:%d\n", getpid(), getppid());
sleep(1);
}
}
else if(id > 0)
{
//parent
while(1)
{
printf("我的父进程,我的pid为:%d,我父亲的pid为:%d\n", getpid(), getppid());
sleep(1);
}
}
else
{
printf("创建进程失败!");
return 1;
}
return 0;
}
执行结果如下:
fork一般使用if进行分流(根据返回值不同)
通过写实拷贝保证代码共享和进程独立性
五.下章重点
5.1 进程状态
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Linux基础4-进程1(操作系统,进程介绍,Linux进程相关命令,getpid,fork)
发表评论 取消回复