进程和线程
进程process:概念、性质、分类、创建、退出、通信IPC、同步
线程thread:概念、通信、同步semaphore和互斥mutex
笔试和面试
进程和线程概念、性质
工作中
进程和线程的通信、同步、互斥
今天的内容
进程process:
进程的引进是为了实现并发任务。
== 概念:***** ==
进程是程序运行的一次过程。
进程是操作系统分配资源的最小单位。(内存资源)
//进程是一段具有独立功能的程序在某个数据集合上的一次运行的过程。
== 进程和程序的关系==
1. 进程是动态的;程序是静态的。
2. 进程是不可以保存的;程序是可以保存的。
3. 进程是程序运行的一次过程。
描述进程
进程号 父进程号 //一般情况下都是唯一的,类似于身份证号
特点:
并发性、动态性、独立性、制约性
状态切换:
运行态、就绪态、等待态
分类:
交互进程 批处理进程 后台进程(守护进程/精灵进程)
创建
pid_t fork();
获取当前进程的进程号
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
获取当前进程的父进程的进程号
pid_t getppid(void);
退出
1. main函数结束 return 0;
2. while(1); --> ctrl-c
3. kill -9 进程号 --> 信号
4. exit(), _exit()
#include <stdlib.h>
void exit( int status );
退出当前进程。参数是当前进程的退出状态,将会用status & 0377返回给父进程。
父进程可以使用wait()/waitpid()进行接收返回值。
回收资源。
#include <unistd.h>
void _exit( int status );
立即退出当前进程。参数是当前进程的退出状态,将会用status & 0377返回给父进程。
父进程可以使用wait()/waitpid()进行接收返回值。
不回收资源。
==等待退出 ==
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
阻塞等待子进程结束,并且接收子进程exit退出返回的值。
参数status是一个整型的指针,被分为两部分,一部分用于存放退出原因,另一部分存放exit的返回值。
需要使用一些宏来判断
WIFEXITED(status)为真,则正常退出
WIFSIGNALED(status)为真,则收到信号退出
WIFSTOPPED(status)为真,则进程停止
WIFCONTINUED(status)为真,则进程继续
pid_t waitpid(pid_t pid, int * status, int option );
//option为WNOHANG非阻塞
一般的使用方式:
子进程如果没有结束,做父进程自己的事,
子进程如果已经结束,回收资源。
系统调用exec函数族
exec函数族提供了一种在进程中启动另一个程序执行的方法。
它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
正确的使用exec的方式是
在需要的时候,创建子进程,在子进程里面执行exec
int execl(const char *path, const char *arg, …);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg, …, char *const envp[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg, …);
int execvp(const char *file, char *const argv[]);
分解:
l:list列写
v:vector向量(数组)
e:环境变量
p:path路径
例:
执行ls命令
该文件是/bin/ls
我想查看/home/farsight下的内容
执行命令: ls /home/farsight
execl("/bin/ls", “ls”, “/home/farsight”, NULL );
作业:
exit和_exit
内容写回文件在close文件之前的时候,分别使用exit和_exit,测试一下效果。
预习:守护进程 进程间通信
补充:
进程在创建的时候,会分配4G的虚拟内存。
虚拟内存分为两个部分:0~3G用户空间(user space), 3G~4G内核空间(kernel space)
用户的应用程序运行在user space,内核程序(包括驱动)运行在kernel space.
物理内存:硬件4G,8G,12G
嵌入式的硬件:内存256M 64M
TV BD DVD