Day 74 ipc

mac2022-06-30  50

1.进程与线程概念:进程线程都是为了实现并发,线程可以说是轻量级的进程。新开一个进程系统会分配4G的虚拟内存空间,进程的资源是不共享的。新开一个线程系统会给新的线程划分一个8M的私有空间,线程的资源是共享的。 区别:进程比线程要稳定,一个进程崩了不会影响其他进程;线程稳定性比进程要差;线程执行效率比进程要高。开一个进程要4g虚拟内存,而提起一个线程只需要新开一个8M的私有栈。

2.进程间通讯的方式(interprocess communicate):进程间通讯分三大类: IPC 进程间通信 interprocess communicate 三大类: (1)古老的通信方式: 无名管道 有名管道 信号

(2)IPC对象通信 system v BSD suse fedora kernel.org 消息队列 共享内存 信号量集

(3)socket通信 网络通信 线程信号,posix sem_init

特列:古老的通信方式中信号是唯一的异步通信 所有的通信方式中共享内存是唯一的最高效 3.手写无名管道: #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h>

int main(int argc, const char *argv[]) {

//创建并打开一个无名管道 int pipefd[2]={0}; //pipe函数将创建的pipefd数组初始化。ret返回0则成功 int ret = pipe(pipefd); if(-1 == ret) { perror("pipe"); exit(1); } //创建无名管道要在fork之前 pid_t pid = fork(); if( pid >0) { while(1) { //pipefd[0]为无名管道的固定读端,父进程要写所以把读端要关闭。 close(pipefd[0]); char buf[]="hello,pipe test..."; write(pipefd[1],buf,strlen(buf)); } } if(0 == pid) { while(1) { //pipefd[1]为无名管道的固定写端,子进程是要读的所以把,写端要关闭 close(pipefd[1]); char buf[50]={0}; //sleep(1); read(pipefd[0],buf,50); printf("pipe:%s\n",buf); } } if(pid<0) { perror("fork"); exit(1); } return 0;

}

有名管道: 结论:有名管道执行过程过必须有读写端同时存在。 如果有一端没有打开,则默认在open函数部分阻塞。

4.进程间通信方式的区别和各自的优缺点: 无名管道有名管道是主机进程之间的通信,比较便捷。共享内存通信方式效率最高 socket通信是不同网络主机之间可以通信。

5.什么是共享内存,讲讲。 共享内存 ===》效率最高的进程间通信方式

操作流程: key ==》申请对象 ==》映射对象==》读写对象 ==》撤销映射 ==》删除对象

6.说下无名管道和有名管道的区别: 无名管道只能在有亲缘关系的进程间进行通信,有名管道可以在不同进程间进行通信。

7.多路io: 当系统的并发量并不是那么高时可以采用,多路io实际上就是对那些占用服务器资源不是很久的请求。 进行轮流响应服务。

8.select 和epoll的区别以及在内核中的实现方式: select采用的是轮询的机制,底层是系统一个个去查看有没有响应。而epoll 采用的是中断的机制,谁到来就响应谁,

9.讲讲内核中的poll 函数: 讲讲poll_wait poll_table

10.多线程如何通信: 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。

11.写出信号量同步和互斥锁 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <semaphore.h>

sem_t sem_H,sem_W;

void *th1(void *arg) { while(1) { //p操作,使sem_H – sem_wait(&sem_H); printf(“hello”); //v操作 使sem_W ++ sem_post(&sem_W); }

}

void *th2(void *arg) { while(1) { //使sem_W – sem_wait(&sem_W); printf(“world\n”); //使sem_H ++ sem_post(&sem_H); }

}

int main(int argc, char *argv[]) {

//初始化信号量 sem_init(&sem_H,0,1); sem_init(&sem_W,0,0); //定义pid pthread_t tid1, tid2; pthread_create(&tid1, NULL, th1, NULL); pthread_create(&tid2,NULL, th2, NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); //销毁信号量 sem_destroy(&sem_H); sem_destroy(&sem_W); return 0;

}

12.讲讲两者的区别:


sizeof是一个取字节运算符,而strlen是一个函数

最新回复(0)