Sybase库最近出现timeslice -501, current process infected问题,记录下...

本文记录了一次数据库进程出现SQL错误的情况,详细展示了内核层面的时间切片、错误处理过程及堆栈跟踪信息。通过对日志的分析,可以了解在特定条件下数据库进程如何响应SQL错误并触发终止。
00:00000:01604:2014/07/02 22:01:18.74 kernel  timeslice -501, current process infected
00:00000:01604:2014/07/02 22:02:29.24 kernel  ************************************
00:00000:01604:2014/07/02 22:02:29.24 kernel  SQL causing error :
00:00000:01604:2014/07/02 22:02:29.24 kernel  ************************************
00:00000:01604:2014/07/02 22:02:29.24 server  SQL Text:
00:00000:01604:2014/07/02 22:02:29.24 kernel  curdb = 4 tempdb = 2 pstat = 0x10000
00:00000:01604:2014/07/02 22:02:29.24 kernel  lasterror = 4016 preverror = 0 transtate = 1
00:00000:01604:2014/07/02 22:02:29.24 kernel  curcmd = 0 program =                               
00:00000:01604:2014/07/02 22:02:29.24 kernel  pc: 0x00000000808f6818 pcstkwalk+0x28(0x000001001bdd83e8, 0x000001001bdd7b60, 0x000000000000270f, 0x0000000000000002, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.24 kernel  pc: 0x00000000808f65f0 ucstkgentrace+0xbc(0x000000004a700b75, 0x0000000000000000, 0x000001008ae0ba80, 0x0000000000000000, 0x000001009df82030)
00:00000:01604:2014/07/02 22:02:29.24 kernel  pc: 0x000000008089f8c8 ucbacktrace+0x84(0x0000000000000000, 0x0000000000000001, 0x000000000000001e, 0x000001008ae1fbf4, 0x0000010000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x000000008025131c terminate_process+0x860(0x000001008ae0ba80, 0x000000000000a400, 0x000001001bdd8b00, 0xffffffff7e04cb10, 0x2020202020202020)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0xffffffff7ded61c8 __sighndlr+0xc(0x0000000000000010, 0x000001001bdd8de0, 0x000001001bdd8b00, 0x00000000808bf4ec, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0xffffffff7dec9d2c call_user_handler+0x3e0(0xffffffff7e000200, 0xffffffff7e000200, 0x000001001bdd8b00, 0x0000000000000008, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0xffffffff7dec9f24 sigacthandler+0x54(0x0000000000000000, 0x000001001bdd8de0, 0x000001001bdd8b00, 0xffffffff7e000200, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0xffffffff7dec78d4 write+0x60(0x0000000000000001, 0x000001001bdd9100, 0x000000000000006b, 0x0000000000000000, 0x000000000000ff00)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x00000000808b1ccc b_cerrlog_uio+0x94(0x000001001bdd9100, 0x000001001bdd9100, 0x0000000081133400, 0xffffffffffffffd3, 0x00000000801fbd84)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x00000000808b0a88 uciverrlog+0x34(0x000000000000000a, 0x000000000002e6bd, 0x000001001bdd9440, 0x000000000a57327b, 0x0000000000009800)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x00000000808b096c ucierrlog+0x20(0x000000000000000a, 0x000000000002e6bd, 0x0000000000000002, 0x000001008ae1fb87, 0xffffffff7ecbc8a0)
00:00000:01604:2014/07/02 22:02:29.26 kernel  [Handler pc: 0x00000000802aca98 hdl_backout installed by the following function:-]
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x0000000080273024 login+0x1784(0x000000000000a400, 0x000001008ae160b0, 0x0000000000400000, 0x0000000000007800, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  [Handler pc: 0x00000000802aca98 hdl_backout installed by the following function:-]
00:00000:01604:2014/07/02 22:02:29.26 kernel  [Handler pc: 0x00000000804fad28 ut_handle installed by the following function:-]
00:00000:01604:2014/07/02 22:02:29.26 kernel  [Handler pc: 0x00000000804fad28 ut_handle installed by the following function:-]
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x0000000080201030 conn_hdlr+0x7c0(0x00000000000076b8, 0x0000000000001400, 0x000001008ae15804, 0x0000000000007400, 0xffffffffffffffff)
00:00000:01604:2014/07/02 22:02:29.26 kernel  pc: 0x000000008090cc48 _coldstart(0x000000000000061f, 0x0000000080200870, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000)
00:00000:01604:2014/07/02 22:02:29.26 kernel  end of stack trace, spid 1604, kpid 1248856949, suid 14
08:00000:01980:2014/07/02 22:02:29.27 server  DBCC TRACEON 3604, SPID 1980

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29649637/viewspace-1207286/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29649637/viewspace-1207286/

#include <iostream> #include <fstream> #include <vector> #include <queue> #include <algorithm> #include <iomanip> #include <string> #include <climits> using namespace std; // 进程状态枚举 enum ProcessState { READY, RUNNING, BLOCKED, FINISHED }; // 片段类型枚举 enum SegmentType { CPU_SEGMENT, IO_SEGMENT }; // 进程片段结构体 struct Segment { SegmentType type; int length; int remaining; // 剩余执行时间 Segment(SegmentType t, int len) : type(t), length(len), remaining(len) {} }; // 进程结构体 struct Process { int id; int priority; int arrivalTime; vector<Segment> segments; int currentSegment; // 当前执行的片段索引 // 统计信息 int finishTime; int timeSliceUsed; int readyWaitTime; int IOWaitTime; int CPUTime; int IOTime; int turnaroundTime; double weightedTurnaroundTime; ProcessState state; int remainingTimeSlice; // 当前时间片剩余时间 Process(int id, int pri, int arr, const vector<Segment>& segs) : id(id), priority(pri), arrivalTime(arr), segments(segs), currentSegment(0), finishTime(0), timeSliceUsed(0), readyWaitTime(0), IOWaitTime(0), CPUTime(0), IOTime(0), turnaroundTime(0), weightedTurnaroundTime(0.0), state(READY), remainingTimeSlice(0) { } }; // 系统统计结构体 struct SystemStats { int totalProcesses; int timeSlice; int totalCPUTime; int totalIOTime; double avgReadyWaitTime; double avgIOWaitTime; double avgCPUTime; double avgIOTime; double avgTurnaroundTime; double avgWeightedTurnaroundTime; }; class Scheduler { private: vector<Process> processes; int timeSlice; int currentTime; queue<int> readyQueue; // 存储进程ID queue<int> ioQueue; // 存储进程ID vector<int> finishedProcesses; // 存储已完成进程ID Process* currentProcess; // 当前运行的进程 bool cpuBusy; bool ioBusy; Process* ioProcess; // 当前使用IO设备的进程 SystemStats stats; public: Scheduler(const vector<Process>& procs, int ts) : processes(procs), timeSlice(ts), currentTime(0), currentProcess(nullptr), cpuBusy(false), ioBusy(false), ioProcess(nullptr) { // 初始化统计信息 stats.totalProcesses = procs.size(); stats.timeSlice = ts; stats.totalCPUTime = 0; stats.totalIOTime = 0; // 按到达时间排序进程 sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) { return a.arrivalTime < b.arrivalTime; }); // 初始化就绪队列 for (int i = 0; i < processes.size(); i++) { if (processes[i].arrivalTime <= currentTime) { readyQueue.push(i); } } } // 简单轮转调度 - 主调度循环 void roundRobinScheduling() { while (!allProcessesFinished()) { checkNewArrivals(); processIO(); scheduleCPU(); currentTime++; updateWaitTimes(); } calculateStatistics(); } // 带优先级调度 - 主调度循环 void priorityScheduling() { while (!allProcessesFinished()) { checkNewArrivals(); processIO(); scheduleCPUWithPriority(); currentTime++; updateWaitTimes(); } calculateStatistics(); } private: bool allProcessesFinished() { return finishedProcesses.size() == processes.size(); } void checkNewArrivals() { for (int i = 0; i < processes.size(); i++) { if (processes[i].arrivalTime == currentTime && processes[i].state == READY) { readyQueue.push(i); } } } // IO设备处理函数 void processIO() { // 第一部分:处理当前正在使用IO设备的进程 if (ioBusy && ioProcess) { // 检查进程是否已完成(可能在别处完成) if (ioProcess->state == FINISHED) { ioBusy = false; ioProcess = nullptr; return; } Segment& currentSegment = ioProcess->segments[ioProcess->currentSegment]; currentSegment.remaining--; ioProcess->IOTime++; stats.totalIOTime++; if (currentSegment.remaining == 0) { ioProcess->currentSegment++; if (ioProcess->currentSegment >= ioProcess->segments.size()) { ioProcess->state = FINISHED; ioProcess->finishTime = currentTime; finishedProcesses.push_back(ioProcess->id); } else { ioProcess->state = READY; readyQueue.push(findProcessIndex(ioProcess->id)); } ioBusy = false; ioProcess = nullptr; } } // 第二部分:如果IO设备空闲,从IO队列中取出下一个等待IO的进程 if (!ioBusy && !ioQueue.empty()) { // 可能需要跳过已完成的进程 while (!ioQueue.empty()) { int nextIOIndex = ioQueue.front(); ioQueue.pop(); Process& nextProcess = processes[nextIOIndex]; // 检查进程是否已完成或不在阻塞状态 if (nextProcess.state == FINISHED) { continue; // 跳过已完成的进程 } // 确保进程当前需要IO操作 if (nextProcess.currentSegment < nextProcess.segments.size() && nextProcess.segments[nextProcess.currentSegment].type == IO_SEGMENT) { nextProcess.state = BLOCKED; ioProcess = &nextProcess; ioBusy = true; break; } } } } // CPU调度核心函数 - 轮转调度 void scheduleCPU() { // 第一部分:处理当前正在运行的进程 if (cpuBusy && currentProcess) { Segment& currentSegment = currentProcess->segments[currentProcess->currentSegment]; currentSegment.remaining--; currentProcess->CPUTime++; currentProcess->remainingTimeSlice--; stats.totalCPUTime++; if (currentSegment.remaining == 0) { currentProcess->currentSegment++; if (currentProcess->currentSegment >= currentProcess->segments.size()) { currentProcess->state = FINISHED; currentProcess->finishTime = currentTime; finishedProcesses.push_back(currentProcess->id); cpuBusy = false; currentProcess = nullptr; } else { Segment& nextSegment = currentProcess->segments[currentProcess->currentSegment]; if (nextSegment.type == IO_SEGMENT) { currentProcess->state = BLOCKED; ioQueue.push(findProcessIndex(currentProcess->id)); } else { currentProcess->state = READY; readyQueue.push(findProcessIndex(currentProcess->id)); } cpuBusy = false; currentProcess = nullptr; } } else if (currentProcess->remainingTimeSlice == 0) { currentProcess->state = READY; readyQueue.push(findProcessIndex(currentProcess->id)); cpuBusy = false; currentProcess = nullptr; } } // 第二部分:如果CPU空闲,从就绪队列中取出下一个进程执行 if (!cpuBusy && !readyQueue.empty()) { // 可能需要跳过已完成的进程 while (!readyQueue.empty()) { int nextIndex = readyQueue.front(); readyQueue.pop(); Process& nextProcess = processes[nextIndex]; // 检查进程是否已完成 if (nextProcess.state == FINISHED) { continue; } // 确保进程当前需要CPU操作 if (nextProcess.currentSegment < nextProcess.segments.size() && nextProcess.segments[nextProcess.currentSegment].type == CPU_SEGMENT) { nextProcess.state = RUNNING; nextProcess.remainingTimeSlice = timeSlice; nextProcess.timeSliceUsed++; currentProcess = &nextProcess; cpuBusy = true; break; } else { // 如果当前不是CPU片段,重新加入队列或处理IO if (nextProcess.currentSegment < nextProcess.segments.size() && nextProcess.segments[nextProcess.currentSegment].type == IO_SEGMENT) { nextProcess.state = BLOCKED; ioQueue.push(nextIndex); } } } } } // CPU调度核心函数 - 优先级调度 void scheduleCPUWithPriority() { // 第一部分:处理当前正在运行的进程(与轮转调度相同) if (cpuBusy && currentProcess) { Segment& currentSegment = currentProcess->segments[currentProcess->currentSegment]; currentSegment.remaining--; currentProcess->CPUTime++; currentProcess->remainingTimeSlice--; stats.totalCPUTime++; if (currentSegment.remaining == 0) { currentProcess->currentSegment++; if (currentProcess->currentSegment >= currentProcess->segments.size()) { currentProcess->state = FINISHED; currentProcess->finishTime = currentTime; finishedProcesses.push_back(currentProcess->id); cpuBusy = false; currentProcess = nullptr; } else { Segment& nextSegment = currentProcess->segments[currentProcess->currentSegment]; if (nextSegment.type == IO_SEGMENT) { currentProcess->state = BLOCKED; ioQueue.push(findProcessIndex(currentProcess->id)); } else { currentProcess->state = READY; readyQueue.push(findProcessIndex(currentProcess->id)); } cpuBusy = false; currentProcess = nullptr; } } else if (currentProcess->remainingTimeSlice == 0) { currentProcess->state = READY; readyQueue.push(findProcessIndex(currentProcess->id)); cpuBusy = false; currentProcess = nullptr; } } // 第二部分:优先级调度 - 选择优先级最高的进程 if (!cpuBusy && !readyQueue.empty()) { int highestPriorityIndex = -1; int highestPriority = INT_MAX; // 遍历就绪队列找到优先级最高的进程 queue<int> tempQueue = readyQueue; while (!tempQueue.empty()) { int procIndex = tempQueue.front(); tempQueue.pop(); Process& proc = processes[procIndex]; if (proc.state != FINISHED && proc.currentSegment < proc.segments.size() && proc.segments[proc.currentSegment].type == CPU_SEGMENT) { // 优先级数值越小,优先级越高 if (proc.priority < highestPriority) { highestPriority = proc.priority; highestPriorityIndex = procIndex; } } } if (highestPriorityIndex != -1) { // 从队列中移除选中的进程 queue<int> newReadyQueue; while (!readyQueue.empty()) { int procIndex = readyQueue.front(); readyQueue.pop(); if (procIndex != highestPriorityIndex) { newReadyQueue.push(procIndex); } } readyQueue = newReadyQueue; // 调度选中的进程 Process& selectedProcess = processes[highestPriorityIndex]; selectedProcess.state = RUNNING; selectedProcess.remainingTimeSlice = timeSlice; selectedProcess.timeSliceUsed++; currentProcess = &selectedProcess; cpuBusy = true; } } } void updateWaitTimes() { // 更新就绪队列中所有进程的CPU等待时间 queue<int> tempQueue = readyQueue; while (!tempQueue.empty()) { int procIndex = tempQueue.front(); tempQueue.pop(); // 只更新未完成的进程 if (processes[procIndex].state != FINISHED) { processes[procIndex].readyWaitTime++; } } // 更新IO队列中所有进程的IO等待时间 queue<int> tempIOQueue = ioQueue; while (!tempIOQueue.empty()) { int procIndex = tempIOQueue.front(); tempIOQueue.pop(); // 只更新未完成的进程 if (processes[procIndex].state != FINISHED) { processes[procIndex].IOWaitTime++; } } } int findProcessIndex(int id) { for (int i = 0; i < processes.size(); i++) { if (processes[i].id == id) { return i; } } return -1; } void calculateStatistics() { double totalReadyWait = 0; double totalIOWait = 0; double totalCPUTime = 0; double totalIOTime = 0; double totalTurnaround = 0; double totalWeightedTurnaround = 0; for (Process& proc : processes) { proc.turnaroundTime = proc.finishTime - proc.arrivalTime; proc.weightedTurnaroundTime = static_cast<double>(proc.turnaroundTime) / (proc.CPUTime + proc.IOTime); totalReadyWait += proc.readyWaitTime; totalIOWait += proc.IOWaitTime; totalCPUTime += proc.CPUTime; totalIOTime += proc.IOTime; totalTurnaround += proc.turnaroundTime; totalWeightedTurnaround += proc.weightedTurnaroundTime; } stats.avgReadyWaitTime = totalReadyWait / processes.size(); stats.avgIOWaitTime = totalIOWait / processes.size(); stats.avgCPUTime = totalCPUTime / processes.size(); stats.avgIOTime = totalIOTime / processes.size(); stats.avgTurnaroundTime = totalTurnaround / processes.size(); stats.avgWeightedTurnaroundTime = totalWeightedTurnaround / processes.size(); } public: void writeResultsToFile(const string& filename) { ofstream outFile(filename); if (!outFile) { cerr << "无法打开输出文件: " << filename << endl; return; } vector<Process> sortedProcesses = processes; sort(sortedProcesses.begin(), sortedProcesses.end(), [](const Process& a, const Process& b) { return a.finishTime < b.finishTime; }); outFile << "Processes: " << setw(3) << right << stats.totalProcesses << " TimeSlice: " << setw(3) << right << stats.timeSlice << endl; for (const Process& proc : sortedProcesses) { int cpuPieces = 0; int ioPieces = 0; for (const Segment& seg : proc.segments) { if (seg.type == CPU_SEGMENT) { cpuPieces++; } else { ioPieces++; } } outFile << "ID " << setw(2) << right << proc.id << ": "; outFile << "Priority: " << setw(4) << right << proc.priority << ", "; outFile << "Arrival: " << setw(4) << right << proc.arrivalTime << ", "; outFile << "Finish: " << setw(5) << right << proc.finishTime << ", "; outFile << "CPU pieces: " << setw(2) << right << cpuPieces << ", "; outFile << "IO pieces: " << setw(2) << right << ioPieces << ", "; outFile << "CPU wait: " << setw(4) << right << proc.readyWaitTime << ", "; outFile << "CPU: " << setw(3) << right << proc.CPUTime << ", "; outFile << "IO wait: " << setw(5) << right << proc.IOWaitTime << ", "; outFile << "IO: " << setw(4) << right << proc.IOTime << ", "; outFile << "Turnover: " << setw(5) << right << proc.turnaroundTime << ", "; outFile << "Weighted turnover: " << fixed << setprecision(3) << setw(7) << right << proc.weightedTurnaroundTime << endl; } outFile << "Average CPU wait: " << fixed << setprecision(3) << setw(8) << right << stats.avgReadyWaitTime << ", "; outFile << "Average CPU: " << fixed << setprecision(3) << setw(8) << right << stats.avgCPUTime << ", "; outFile << "Average IO wait: " << fixed << setprecision(3) << setw(8) << right << stats.avgIOWaitTime << ", "; outFile << "Average IO: " << fixed << setprecision(3) << setw(8) << right << stats.avgIOTime << ", "; outFile << "Average turnover: " << fixed << setprecision(3) << setw(8) << right << stats.avgTurnaroundTime << ", "; outFile << "Average weighted turnover: " << fixed << setprecision(3) << setw(8) << right << stats.avgWeightedTurnaroundTime << endl; outFile.close(); } void printStatistics() { cout << "\n=== 调度统计结果 ===" << endl; cout << "进程数量: " << stats.totalProcesses << endl; cout << "时间片大小: " << stats.timeSlice << endl; cout << "平均就绪等待时间: " << fixed << setprecision(2) << stats.avgReadyWaitTime << endl; cout << "平均IO等待时间: " << stats.avgIOWaitTime << endl; cout << "平均占用CPU时间: " << stats.avgCPUTime << endl; cout << "平均占用IO设备时间: " << stats.avgIOTime << endl; cout << "平均周转时间: " << stats.avgTurnaroundTime << endl; cout << "平均带权周转时间: " << stats.avgWeightedTurnaroundTime << endl; } }; vector<Process> readProcessFile(const string& filename) { ifstream inFile(filename); vector<Process> processes; if (!inFile) { cerr << "无法打开输入文件: " << filename << endl; return processes; } int n; inFile >> n; for (int i = 0; i < n; i++) { int id, priority, arrivalTime, m; inFile >> id >> priority >> arrivalTime >> m; vector<Segment> segments; for (int j = 0; j < m; j++) { int segmentLength; inFile >> segmentLength; SegmentType type = (j % 2 == 0) ? CPU_SEGMENT : IO_SEGMENT; segments.push_back(Segment(type, segmentLength)); } processes.push_back(Process(id, priority, arrivalTime, segments)); } inFile.close(); return processes; } int main() { vector<Process> processes = readProcessFile("TASK"); if (processes.empty()) { cerr << "没有读取到进程数据,程序退出" << endl; return 1; } int choice; bool running = true; while (running) { cout << "\n========== 进程调度系统 ==========" << endl; cout << "1. 简单轮转调度" << endl; cout << "2. 带优先级调度" << endl; cout << "3. 退出程序" << endl; cout << "请选择调度算法: "; cin >> choice; if (choice == 1 || choice == 2) { int timeSlice; cout << "\n请输入时间片大小(范围:5-20): "; cin >> timeSlice; while (timeSlice < 5 || timeSlice > 20) { cout << "输入无效!时间片大小必须在 5-20 之间,请重新输入: "; cin >> timeSlice; } cout << "\n=== 使用时间片大小: " << timeSlice << " 进行调度 ===" << endl; vector<Process> freshProcesses = readProcessFile("TASK"); if (freshProcesses.empty()) { cerr << "无法重新读取进程数据" << endl; continue; } Scheduler scheduler(freshProcesses, timeSlice); if (choice == 1) { cout << "\n=== 使用简单轮转调度 ===" << endl; scheduler.roundRobinScheduling(); scheduler.writeResultsToFile("ROUND"); cout << "\n调度完成!结果已保存到 ROUND 文件。" << endl; } else { cout << "\n=== 使用带优先级调度 ===" << endl; scheduler.priorityScheduling(); scheduler.writeResultsToFile("PRIORITY"); cout << "\n调度完成!结果已保存到 PRIORITY 文件。" << endl; } scheduler.printStatistics(); } else if (choice == 3) { cout << "\n感谢使用,程序退出!" << endl; running = false; } else { cout << "\n输入无效!请输入 1、2 或 3。" << endl; } } return 0; }此段代码执行优先级调度(时间片为5)5 1 0 0 5 25 150 30 200 35 2 0 1 4 15 120 20 180 3 0 2 6 20 160 25 140 30 200 4 0 3 3 30 250 35 5 0 4 5 40 170 45 190 50输出结果是什莫
最新发布
12-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值