系统编程阶段:
需要学哪些?
进程概念-》进程控制-》基础IO-》进程间通信–》进程间通信-》进程信号-》多线程
进程概念:
首先要知道冯诺依曼体系结构:
如果输入设备直接把数据产能送到CPU中的话,在传输数据的时候,可能要花很长时间,结果送到CPU中一下就处理好了,然后再花好长时间把数据送到输出设备,这样就是对CPU的浪费,因此,输入设备先把数据送到存储器中,CPU处理完了直接从存储器中拿数据,增大CPU的利用率。
ps:硬件结构决定软件行为。
操作系统:
目的:让计算机更好用
功能:一款搞管理的软件–管理软硬件资源,提供良好的执行环境
如何管理:先描述,再组织(学校管理的例子)
驱动程序:它是执行者,系统接口不好用,就出现了shell和库
管理者并不需要直接与被管理者交互进行管理,而是通过对被管理者进行描述,并且将描述信息得当的组织起来进行管理。
库函数与系统调用的关系:
库函数是对系统调用的一层封装,他们是上下级的调用关系。库函数调用系统调用接口
操作系统:搞管理的软件,对下管理软硬件资源,对上提供良好的执行环境
重点来啦~~~~~
进程概念:
程序:一堆代码(在硬盘上),程序运行起来会被加载到内存中
用户角度:运行起来的程序
操作系统角度:程序运行需要将代码数据加载到内存中,一个操作系统运行起来会有很多的程序,那么操作系统怎么去管理呢?比如说某个程序运行到哪了?
在操作系统的层面,进程就是操作系统对一个运行中程序的描述(校长眼里看到了同学们的档案就仿佛看到了真人,通过档案来管理学生,在操作系统眼中看到了进程的描述信息,就通过信息管理进程),这个描述信息----PCB(进程控制块)—linux下是struct task_struct结构体。
问题:CPU只有一个,如何做到同时处理多个程序?比如我们可以边听歌边聊天?
答:CPU的分时技术:一个程序执行一点点,就去执行另一个,然后如此循环往复。切换的速度很快,我们根本感觉不到。
时间片:cpu在每个程序上运行的时间
问题:cpu循环切换的时候,如何找到之前运行的状态?
答:拿到PCB(描述信息):在一个task_struct结构体中,几千行代码
程序计数器,
上下文数据,
内存指针(根据PCB找到对应指令在内存中的位置)
记账信息
进程状态
优先级
进程标识符(PID)
文件的IO状态信息
sudo:
查看进程:
/proc
ps
-ef:简单信息
-aux:详细信息
getpid() 获取进程的进程id
但是出来的进程信息太多怎么办?
ps -aux|grep loop(程序名)
pid_t getpid():获取进程id
boot:放的是系统的引导文件
etc:放的配置文件
lib:放的是库文件
bin:放的是命令文件
dev:放设备文件
opt:放第三方数据
sys:放系统文件
tmp:放日志文件
进程创建:
复制:pcb—操作系统通过复制父进程,创建子进程,因此父子进程数据独有,代码共享
返回值
根据返回值不同,实现分流(父进程返回子进程的pid>0)子进程返回0
创建子进程的作用?
1、压力分摊
2、干其他工作(背锅)
问:如何区分子父进程?
通过folk的返回值
父进程返回>0
子进程返回0
进程状态:就绪、阻塞、运行、停止
Linux下:
运行(R),可中断睡眠(S),不可中断睡眠(D),停止(T),死亡(X),僵死(Z)
R:运行
S:睡眠
D:休眠也就不可中断睡眠
T:停止(什么都没干),用kill都杀不掉
X:死亡状态
Z:僵死
kill:杀掉一个进程
-9:强制杀死
-18:继续运行
问: 什么进程杀不死?
僵尸进程杀不死
僵尸进程:
处于僵死状态的进程
产生原因:
子进程先于父进程退出,操作系统(警察的角色)检测到进程的退出,保留退出原因,通知父进程,但是父进程这时候正在打麻将,没有关注这个通知,这时候操作系统为了封锁现场,不会释放子进程资源,因为子进程的pcb中包含有退出原因,这时候因为既没有运行也没有完全退出,因此处于僵死状态,成为僵尸进程。
危害:资源泄露
问:如何处理僵尸进程?
关闭父进程
避免方法?
进程等待
孤儿进程:
父进程先于子进程退出,父进程退出后,子进程成为后台进程,并且1号进程(init进程)(孤儿院的角色)成为父进程。
精灵进程(守护进程):
特殊的孤儿进程(以d结尾)脱离终端会话影响