问题遇到的现象和发生背景
用WinSCP在华为云服务器运行程序,没有任何输出;在main()函数第一行printf也没有输出
用代码块功能插入代码,请勿粘贴截图
我的解答思路和尝试过的方法
求看一看是什么方面的问题
我想要达到的结果
#include <sys/types.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#define PROCESS_NAME_LEN 32
#define MIN_SLICE 10
#define DEFAULT_MEM_SIZE 1024
#define DEFAULT_MEM_START 0
#define MA_FF 1
#define MA_BF 2
#define MA_WF 3
int mem_size=DEFAULT_MEM_SIZE;
int ma_algorithm = MA_FF;
static int pid = 0;
int flag = 0;
int free_block_count= 0;
int current_free_mem_size= 0;
struct free_block_type{
int size;
int start_addr;
struct free_block_type *next;
};
struct free_block_type *free_block=NULL;;
/*每个进程分配到的内存块的描述*/
struct allocated_block{
int pid; int size;
int start_addr;
char process_name[PROCESS_NAME_LEN];
struct allocated_block *next;
};
/*进程分配内存块链表的首指针*/
struct allocated_block *allocated_block_head = NULL;
void rearrange(int algorithm);
void rearrange_WF();
void rearrange_FF();
struct free_block_type* init_free_block(int mem_size);
void rearrange_BF();
int set_mem_size();
int display_mem_usage();
void set_algorithm();
int new_process();
void kill_process();
void display_menu();
int mem_retrench(struct allocated_block* ab);
int allocate_mem(struct allocated_block* ab);
int allocate_FF(struct allocated_block* ab);
struct allocated_block* find_process(int pid);
void free_mem(struct allocated_block* ab);
int dispose(struct allocated_block* free_ab);
int do_exit();
int main() {
printf("begin");
char choice; pid = 0;
printf("...........");
free_block = init_free_block(mem_size); //初始化空闲区
printf("...........");
while (1) {
display_menu(); //显示菜单
fflush(stdin);
choice = getchar(); //获取用户输入
switch (choice) {
case '1': set_mem_size(); break; //设置内存大小
case '2': set_algorithm(); flag = 1; break;//设置算法
case '3': new_process(); flag = 1; break;//创建新进程
case '4': kill_process(); flag = 1; break;//删除进程
case '5': display_mem_usage(); flag = 1; break; //显示内存使用
case '0': do_exit(); exit(0); //释放链表并退出
default: break;
}
}
return 0;
}
/*初始化空闲块,默认为一块,可以指定大小及起始地址*/
struct free_block_type* init_free_block(int mem_size){
struct free_block_type *fb;
fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
if(fb==NULL){
printf("No mem\n");
return NULL;
}
current_free_mem_size = mem_size;
fb->size = mem_size;
fb->start_addr = DEFAULT_MEM_START;
fb->next = NULL;
return fb;
}
/*显示菜单*/
void display_menu(){
printf("\n");
printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
printf("2 - Select memory allocation algorithm\n");
printf("3 - New process \n");
printf("4 - Terminate a process \n");
printf("5 - Display memory usage \n");
printf("0 - Exit\n");
}
/*设置内存的大小*/
int set_mem_size(){
int size;
if(flag!=0){ //防止重复设置
printf("Cannot set memory size again\n");
return 0;
}
printf("Total memory size =");
scanf("%d", &size);
if(size>0) {
mem_size = size;
free_block->size = mem_size;
}
flag=1;
return 1;
}
/* 设置当前的分配算法 */
void set_algorithm(){
int algorithm;
printf("\t1 - First Fit\n");
printf("\t2 - Best Fit \n");
printf("\t3 - Worst Fit \n");
scanf("%d", &algorithm);
if(algorithm>=1 && algorithm <=3)
ma_algorithm=algorithm;
//按指定算法重新排列空闲区链表
rearrange(ma_algorithm);
}
/*按指定的算法整理内存空闲块链表*/
void rearrange(int algorithm){
switch(algorithm){
case MA_FF: rearrange_FF(); break;
case MA_BF: rearrange_BF(); break;
case MA_WF: rearrange_WF(); break;
}
}
/*按FF算法重新整理内存空闲块链表*/
void rearrange_FF(){
//请自行补充
struct free_block_type *head= free_block;
struct free_block_type *forehand,*pre,*rear;
int i;
for(i= 0;i< free_block_count-1;i++)
{
forehand= head;
pre= forehand->next;
rear= pre->next;
while(pre->next!= NULL)
{
if(forehand== head&&forehand->start_addr>= pre->start_addr)
{
//比较空闲链表中第一个空闲块与第二个空闲块的开始地址的大小
head->next= pre->next;
pre->next= head;
head= pre;
forehand= head->next;
pre= forehand->next;
rear= pre->next;
}
else if(pre->start_addr>= rear->start_addr)
{
//比较链表中其它相邻两个结点的开始地址的大小
pre->next= rear->next;
forehand->next= rear;
rear->next= pre;
forehand= rear;
rear= pre->next;
}
else
{
forehand= pre;
pre= rear;
rear= rear->next;
}
}
}
}
/*按BF算法重新整理内存空闲块链表*/
void rearrange_BF(){
//请自行补充
struct free_block_type *head= free_block;
struct free_block_type *forehand,*pre,*rear;
int i;
for(i= 0;i< free_block_count-1;i++)
{
forehand= head;
pre= forehand->next;
rear= pre->next;
while(pre->next!= NULL)
{
if(forehand== head&&forehand->size<= pre->size)
{
//比较空闲链表中第一个空闲块与第二个空闲块的空间的大小
head->next= pre->next;
pre->next= head;
head= pre;
forehand= head->next;
pre= forehand->next;
rear= pre->next;
}
else if(pre->size<= rear->size)
{
//比较链表中其它相邻两个结点的空间的大小
pre->next= rear->next;
forehand->next= rear;
rear->next= pre;
forehand= rear;
rear= pre->next;
}
else
{
forehand= pre;
pre= rear;
rear= rear->next;
}
}
}
}
/*按WF算法重新整理内存空闲块链表*/
void rearrange_WF(){
//请自行补充
struct free_block_type *head= free_block;
struct free_block_type *forehand,*pre,*rear;
int i;
for(i= 0;i< free_block_count-1;i++)
{
forehand= head;
pre= forehand->next;
rear= pre->next;
while(pre->next!= NULL)
{
if(forehand== head&&forehand->size>= pre->size)
{
//比较空闲链表中第一个空闲块与第二个空闲块空间的大小
head->next= pre->next;
pre->next= head;
head= pre;
forehand= head->next;
pre= forehand->next;
rear= pre->next;
}
else if(pre->size>= rear->size)
{
//比较链表中其它相邻两个结点的空间的大小
pre->next= rear->next;
forehand->next= rear;
rear->next= pre;
forehand= rear;
rear= pre->next;
}
else
{
forehand= pre;
pre= rear;
rear= rear->next;
}
}
}
}
/*创建新的进程,主要是获取内存的申请数量*/
int new_process(){
struct allocated_block *ab;
int size; int ret;
ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
if(!ab) exit(-5);
ab->next = NULL;
pid++;
sprintf(ab->process_name, "PROCESS-%02d", pid);
ab->pid = pid;
printf("Memory for %s:", ab->process_name);
scanf("%d", &size);
if(size>0) ab->size=size;
ret = allocate_mem(ab); /* 从空闲区分配内存,ret==1表示分配ok*/
/*如果此时allocated_block_head尚未赋值,则赋值*/
if((ret==1) &&(allocated_block_head == NULL)){
allocated_block_head=ab;
return 1; }
/*分配成功,将该已分配块的描述插入已分配链表*/
else if (ret==1) {
ab->next=allocated_block_head;
allocated_block_head=ab;
return 2; }
else if(ret==-1){ /*分配不成功*/
printf("Allocation fail\n");
free(ab);
return -1;
}
return 3;
}
/*分配内存模块*/
int allocate(struct free_block_type *pre,struct free_block_type *allocate_free_block,struct allocated_block *ab)
{
struct allocated_block *p= allocated_block_head;
ab->start_addr= allocate_free_block->start_addr;
if(allocate_free_block->size-ab->size< MIN_SLICE)
{
ab->size= allocate_free_block->size;
if(pre!= NULL)
{
pre->next= allocate_free_block;
}
else
{
free_block= allocate_free_block->next;
}
free(allocate_free_block);
}
else
{
allocate_free_block->start_addr+= ab->size;
allocate_free_block->size-= ab->size;
}
if(p== NULL)
{
allocated_block_head= ab;
}
else
{
while(p->next!= NULL)
p= p->next;
p->next= ab;
}
current_free_mem_size-= ab->size;
if(current_free_mem_size== 0)
free_block= NULL;
return 0;
}
//按照最坏适应算法给新进程分配内存空间
int allocate_WF(struct allocated_block *ab)
{
int ret;
struct free_block_type *wf= free_block;
if(wf== NULL)
return -1;
if(wf->size>= ab->size)
allocate(NULL,wf,ab);
else if(current_free_mem_size>= ab->size)
ret= mem_retrench(ab);
else
ret= -2;
rearrange_WF();
return ret;
}
//按照最佳适应算法给新进程分配内存空间
int allocate_BF(struct allocated_block *ab)
{
int ret;
struct free_block_type *pre= NULL,*bf= free_block;
if(bf== NULL)
return -1;
while(bf!= NULL)
{
if(bf->size>= ab->size)
{
ret= allocate(pre,bf,ab);
break;
}
pre= bf;
pre= pre->next;
}
if(bf== NULL&¤t_free_mem_size> ab->size)
ret= mem_retrench(ab);
else
ret= -2;
rearrange_BF();
return ret;
}
//按照首次适应算法给新进程分配内存空间
int allocate_FF(struct allocated_block *ab)
{
int ret;
struct free_block_type *pre= NULL,*ff= free_block;
if(ff== NULL)
return -1;
while(ff!= NULL)
{
if(ff->size>= ab->size)
{
ret= allocate(pre,ff,ab);
break;
}
pre= ff;
pre= pre->next;
}
if(ff== NULL&¤t_free_mem_size> ab->size)
ret= mem_retrench(ab);
else
ret= -2;
rearrange_FF();
return ret;
}
int allocate_mem(struct allocated_block *ab){
struct free_block_type *fbt, *pre;
int ret;
int request_size=ab->size;
fbt = pre = free_block;
//根据当前算法在空闲分区链表中搜索合适空闲分区进行分配,分配时注意以下情况:
// 1. 找到可满足空闲分区且分配后剩余空间足够大,则分割
// 2. 找到可满足空闲分区且但分配后剩余空间比较小,则一起分配
// 3. 找不可满足需要的空闲分区但空闲分区之和能满足需要,则采用内存紧缩技术,进行空闲分区的合并,然后再分配
// 4. 在成功分配内存后,应保持空闲分区按照相应算法有序
// 5. 分配成功则返回1,否则返回-1
//请自行补充。。。。。
switch(ma_algorithm)
{
case MA_FF:
ret= allocate_FF(ab);
break;
case MA_BF:
ret= allocate_BF(ab);
break;
case MA_WF:
ret= allocate_WF(ab);
break;
default:
break;
}
return ret;
}
/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
void kill_process(){
struct allocated_block *ab;
int pid;
printf("Kill Process, pid=");
scanf("%d", &pid);
ab=find_process(pid);
if(ab!=NULL){
free_mem(ab); /*释放ab所表示的分配区*/
dispose(ab); /*释放ab数据结构节点*/
}
}
/*将ab所表示的已分配区归还,并进行可能的合并*/
void free_mem(struct allocated_block *ab){
int algorithm = ma_algorithm;
struct free_block_type *fbt, *pre, *work;
fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
// 进行可能的合并,基本策略如下
// 1. 将新释放的结点插入到空闲分区队列末尾
// 2. 对空闲链表按照地址有序排列
// 3. 检查并合并相邻的空闲分区
// 4. 将空闲链表重新按照当前算法排序
//请自行补充……
pre= free_block;
fbt->start_addr= ab->start_addr;
fbt->size= ab->size;
fbt->next= NULL;
if(pre!= NULL)
{
while(pre->next!= NULL)
pre= pre->next;
pre->next= fbt;
}
else
{
free_block= fbt;
}
rearrange_FF();
pre= free_block;
work= pre->next;
while(work!= NULL)
{
if(pre->start_addr+ pre->size== work->start_addr)
{
pre->size+= work->size;
free(work);
work= pre->next;
}
else
{
pre= work;
work= work->next;
}
}
current_free_mem_size+= ab->size;
}
/*释放ab数据结构节点*/
int dispose(struct allocated_block *free_ab){
struct allocated_block *pre, *ab;
if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/
allocated_block_head = allocated_block_head->next;
free(free_ab);
return 1;
}
pre = allocated_block_head;
ab = allocated_block_head->next;
while(ab!=free_ab){ pre = ab; ab = ab->next; }
pre->next = ab->next;
free(ab);
return 2;
}
/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
int display_mem_usage(){
struct free_block_type *fbt=free_block;
struct allocated_block *ab=allocated_block_head;
if(fbt==NULL) return(-1);
printf("----------------------------------------------------------\n");
/* 显示空闲区 */
printf("Free Memory:\n");
printf("%20s %20s\n", " start_addr", " size");
while(fbt!=NULL){
printf("%20d %20d\n", fbt->start_addr, fbt->size);
fbt=fbt->next;
}
/* 显示已分配区 */
printf("\nUsed Memory:\n");
printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
while(ab!=NULL){
printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
ab=ab->next;
}
printf("----------------------------------------------------------\n");
return 0;
}
int mem_retrench(struct allocated_block *ab)
{
struct allocated_block *allocated_work,*allocated_pre= allocated_block_head;
struct free_block_type *free_work,*free_pre= free_block->next;
if(allocated_pre== NULL)
return -1;
allocated_pre->start_addr= 0;
allocated_work= allocated_pre->next;
while(allocated_work!= NULL)
{
allocated_work->start_addr= allocated_pre->start_addr+ allocated_pre->size;
allocated_pre= allocated_work;
allocated_work= allocated_work->next;
}
free_block->start_addr= allocated_pre->start_addr+ allocated_pre->size;
free_block->size= current_free_mem_size;
free_work= free_pre;
while(free_pre!= NULL)
{
free(free_pre);
free_pre= free_work;
if(free_pre!= NULL)
free_work= free_work->next;
}
allocate(NULL,free_block,ab);
return 1;
}
//退出程序并释放空间
int do_exit()
{
struct allocated_block *allocated_ab,*allocated_pre;
struct free_block_type *free_ab,*free_pre;
free_pre= free_block;
allocated_pre= allocated_block_head;
if(free_pre!= NULL)
{
free_ab= free_pre->next;
while(free_ab!= NULL)
{
free(free_pre);
free_pre= free_ab;
free_ab= free_ab->next;
}
}
if(allocated_pre!= NULL)
{
allocated_ab= allocated_pre->next;
while(allocated_ab!= NULL)
{
free(allocated_pre);
allocated_pre= allocated_ab;
allocated_ab= allocated_ab->next;
}
}
allocated_ab= allocated_ab->next;
return 0;
}
//在进程分配链表中寻找指定进程
struct allocated_block* find_process(int pid)
{
struct allocated_block *ab= allocated_block_head;
if(ab== NULL)
{
printf("Here?111\n");
return NULL;
}
while(ab->pid!= pid&&ab->next!= NULL)
ab= ab->next;
if(ab->next== NULL&&ab->pid!= pid)
{
printf("Here?222\n");
return NULL;
}
return ab;
}