二十二、操作系统(内存管理;线程和信号量;进程和lputc,sleep,fork)

一、内存管理(多处理器)

共享内存多处理器状态机

1、多个c语言状态机,拥有独立堆栈且共享内存

2、Data race(数据竞争)=undefined behavior

        atomic_xchg原子数据交换,实现多处理器的同步问题

二、线程和信号量

三、管理地址空间

1、protect/unprotect管理地址空间

2、map可以修改地址映射(虚拟地址映射到物理地址)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常抱歉,我理解有误。以下是读者写者问题的解决方案,写者优先,使用进程实现。 ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/wait.h> #define BUFFER_SIZE 10 int *buffer; // 缓冲区 int shmid; // 共享内存id int read_index = 0; // 读者读取的下标 int write_index = 0; // 写者写入的下标 sem_t *mutex; // 互斥信号量 sem_t *write_sem; // 写者信号量 sem_t *read_sem; // 读者信号量 int read_count = 0; // 当前读者数量 void writer(int value) { while (1) { sleep(1); sem_wait(write_sem); // 等待写者信号量 sem_wait(mutex); // 进入临界区 buffer[write_index] = value; printf("Writer %d writes at Index %d\n", value, write_index); write_index = (write_index + 1) % BUFFER_SIZE; sem_post(mutex); // 退出临界区 sem_post(read_sem); // 发送读者信号量 } } void reader(int value) { int read_value; while (1) { sleep(1); sem_wait(read_sem); // 等待读者信号量 sem_wait(mutex); // 进入临界区 read_count++; if (read_count == 1) { sem_wait(write_sem); // 写者优先 } sem_post(mutex); // 退出临界区 read_value = buffer[read_index]; printf("Reader %d reads from Index %d\n", value, read_index); read_index = (read_index + 1) % BUFFER_SIZE; sem_wait(mutex); // 进入临界区 read_count--; if (read_count == 0) { sem_post(write_sem); // 写者优先 } sem_post(mutex); // 退出临界区 } } int main() { int i, pid[6]; key_t key = ftok(".", 's'); // 创建key shmid = shmget(key, BUFFER_SIZE * sizeof(int), IPC_CREAT | 0666); // 创建共享内存 buffer = (int *)shmat(shmid, NULL, 0); // 连接共享内存 mutex = sem_open("mutex", O_CREAT | O_EXCL, 0666, 1); // 创建互斥信号量 write_sem = sem_open("write_sem", O_CREAT | O_EXCL, 0666, 1); // 创建写者信号量 read_sem = sem_open("read_sem", O_CREAT | O_EXCL, 0666, BUFFER_SIZE); // 创建读者信号量 for (i = 0; i < 3; i++) { pid[i] = fork(); // 创建写者进程 if (pid[i] == 0) { writer(i + 1); exit(0); } } for (i = 0; i < 3; i++) { pid[i + 3] = fork(); // 创建读者进程 if (pid[i + 3] == 0) { reader(i + 1); exit(0); } } for (i = 0; i < 6; i++) { waitpid(pid[i], NULL, 0); // 等待进程结束 } sem_unlink("mutex"); // 删除互斥信号量 sem_unlink("write_sem"); // 删除写者信号量 sem_unlink("read_sem"); // 删除读者信号量 shmdt(buffer); // 断开共享内存连接 shmctl(shmid, IPC_RMID, 0); // 删除共享内存 return 0; } ``` 该程序使用了三个进程作为写者,三个进程作为读者。写者和读者都使用了信号量来实现同步和互斥,共享内存来实现数据的读写。 在写者进程中,等待写者信号量,然后进入临界区,将数据写入缓冲区,然后退出临界区,发送读者信号量。在读者进程中,等待读者信号量,然后进入临界区,读取数据,然后退出临界区,根据读者数量判断是否要等待写者信号量。 在主函数中,创建进程并等待它们结束,然后删除信号量和共享内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值